package com.xcb.spring.beans.factory;

import com.xcb.spring.aop.BeanFactoryAware;
import com.xcb.spring.beans.Autowired;
import com.xcb.spring.beans.BeanReference;
import com.xcb.spring.beans.BeanDefinition;
import com.xcb.spring.beans.PropertyValue;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 可自动装配内容的BeanFactory
 * 
 *
 */
public class AutowireCapableBeanFactory extends AbstractBeanFactory {

	@Override
	protected void applyPropertyValues(Object bean, BeanDefinition mbd) throws Exception {
		if (bean instanceof BeanFactoryAware) {
			((BeanFactoryAware) bean).setBeanFactory(this);
		}
//		for (PropertyValue propertyValue : mbd.getPropertyValues().getPropertyValues()) {
//			Object value = propertyValue.getValue();
//			if (value instanceof BeanReference) {
//				BeanReference beanReference = (BeanReference) value;
//				value = getBean(beanReference.getName());
//			}
//			try {
//				//优先调用setXXX方法注入属性
//				Method declaredMethod = bean.getClass().getDeclaredMethod(
//						"set" + propertyValue.getName().substring(0, 1).toUpperCase()
//								+ propertyValue.getName().substring(1), value.getClass());
//				declaredMethod.setAccessible(true);
//				declaredMethod.invoke(bean, value);
//			} catch (NoSuchMethodException e) {
//				Field declaredField = bean.getClass().getDeclaredField(propertyValue.getName());
//				declaredField.setAccessible(true);
//				declaredField.set(bean, value);
//				e.printStackTrace();
//			}
//		}

		// 填充属性
		Field[] fields = bean.getClass().getDeclaredFields();
		for (Field field : fields) {
			if (field.isAnnotationPresent(Autowired.class)) {
				String fieldName = field.getName();
				Object value = getBean(fieldName);
				field.setAccessible(true);
				field.set(bean, value);
			}
		}
	}
}
